﻿Imports System.Security.Cryptography
Imports System.Text
Module crypt
    <CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1001:TypesThatOwnDisposableFieldsShouldBeDisposable")>
    Public NotInheritable Class MainEnCryptingClass
        Private TripleDes As New TripleDESCryptoServiceProvider
        Sub New(ByVal key As String)
            ' Инициализация основного процесса шифрования.
            TripleDes.Key = TruncateHash(key, TripleDes.KeySize \ 8)
            TripleDes.IV = TruncateHash("", TripleDes.BlockSize \ 8)
        End Sub

        Private Function TruncateHash(ByVal key As String, ByVal length As Integer) As Byte()

            Dim sha1 As New SHA1CryptoServiceProvider

            ' Хэшируется ключ
            Dim keyBytes() As Byte = Encoding.Unicode.GetBytes(key)
            Dim hash() As Byte = sha1.ComputeHash(keyBytes)

            ReDim Preserve hash(length - 1)
            Return hash
        End Function

        Public Function EncryptData(ByVal plaintext As String) As String

            ' Переводим ключ в байтовый массив
            Dim plaintextBytes() As Byte = Encoding.Unicode.GetBytes(plaintext)

            ' Создается MemoryStream.
            Dim ms As New System.IO.MemoryStream
            ' Создание кодировщика
            Dim encStream As New CryptoStream(ms, TripleDes.CreateEncryptor(), CryptoStreamMode.Write)

            ' Использование шифрованного потока для записи массива.
            encStream.Write(plaintextBytes, 0, plaintextBytes.Length)
            encStream.FlushFinalBlock()

            ' Перевод ключа в тестовый формат.
            Return Convert.ToBase64String(ms.ToArray)
        End Function

        Public Function DecryptData(ByVal encryptedtext As String) As String

            ' Переводим ключ в байтовый массив
            Dim encryptedBytes() As Byte = Convert.FromBase64String(encryptedtext)

            '  Создается MemoryStream.
            Dim ms As New System.IO.MemoryStream
            ' Создание кодировщика
            Dim decStream As New CryptoStream(ms, TripleDes.CreateDecryptor(), CryptoStreamMode.Write)

            ' Использование шифрованного потока для записи массива.
            decStream.Write(encryptedBytes, 0, encryptedBytes.Length)
            decStream.FlushFinalBlock()

            ' Перевод ключа в тестовый формат.
            Return Encoding.Unicode.GetString(ms.ToArray)
        End Function

    End Class 'шифрование паролей
End Module
